//
//  Serveur.h
//  Projet A2014
//
//  Created by Jules Thuillier on 03/11/2014.
//  Copyright (c) 2014 Jules Thuillier Erwan Marchand. All rights reserved.
//

#ifndef __Projet_A2014__Serveur__
#define __Projet_A2014__Serveur__


#include <winsock2.h>
#include <iostream>
#include <algorithm>
#include <strstream>
#include <stdio.h>
#include <string>
#include <vector>
#include <map>
#include <ctime>
#include "ClientSocket.h"
#include "CandidatsParser.h"
#include "Journal.h"

#define NUM_THREADS  51

class Serveur;

struct thread_param
{
	Serveur* ser;
	SOCKET soc;
};

class Serveur{

	private:
		int           portMin;
		int           portMax;

		// Vector contenant les  sockets pour les  ports principaux
		std::vector<SOCKET>	   allSockets;
		bool          running;
		SOCKADDR_IN   ServerAddr;

		//Le noeud original de la liste chainee
		ClientSocket    *g_pClientContextHead = NULL;

		// FD Sets des lecture, ecriture et exception
		fd_set g_ReadSet, g_WriteSet, g_ExceptSet;

		void InitSets(SOCKET ListenSocket); // Initialise les set en lecture ou ecriture
		void AcceptConnections(std::vector<SOCKET> ListenSocket); // Fonction principale de gestion des connexions
		int GetSocketSpecificError(SOCKET Socket); // Affiche les erreurs specifiques du socket
		ClientSocket* GetClientContextHead(); // Recupere le noeud d'origine de la liste chainee 
		void AddClientContextToList(ClientSocket *pClientContext); // Ajoute un client a la liste chainee
		ClientSocket * DeleteClientContext(ClientSocket *pClientContext); // Suppime un client de la liste chainee

		void afficherVotes();
		void timerFini();

		std::map <std::string, int> votes; // Contient les votes associes aux candidats
		CandidatsParser *listeCandidats; // Le parser pour recuperer la liste de candidats dans un fichier
		Journal *monJournal; // Le journal des votes
		
		bool choixCandidats(char* motRecu); // Verifie que le choix recu depuis le client est valide

		bool affichageFait; // Booleen pour verifier que l'affichage n'est pas fait pour chaque thread mais une seule fois

		// Timer pour fermer le vote
		clock_t timer;
		double dureeTimer;

	public:

		Serveur();
		int           init();
		int           start();
		int           pause();
};


#endif /* defined(__Projet_A2014__Serveur__) */